package main
import "fmt"

//和与差
func cal_sub(num1 int, num2 int) (int,int) {
	sum1 := num1 + num2
	sub1 := num1 - num2
	return sum1,sub1
}
func cal_sub2(num1 int, num2 int) (sum1 int,sub1 int) {
	sum1 = num1 + num2
	sub1 = num1 - num2
	return
}

//可变参数列表
func change_func(args...int)  {
	for i := 0; i < len(args); i++ {
		fmt.Println(args[i])
	}
}

//函数指针
func ptr_func(num2 int){
	fmt.Println(num2)
}

//回调函数
type myfunc func(int)
func  callback_func(num1 int, num2 float32, testfunc  myfunc){
	fmt.Println("--------回调函数-----------")
}


//闭包 返回是匿名函数 该函数引用了匿名函数外的变量
func getSum() func (int) int{
	var sum int = 0
	return func (num int) int {
		sum+=num
		return sum
	}
}


//defer关键字 不立即zhixingdefer后的语句 而是压入栈 执行后面的语句
func add(num1 int,num2 int)  int{
	defer fmt.Println("num1= ",num1)
	defer fmt.Println("num2= ",num2)
	num1 += 30
	num2 += 30
	var sum int =num1 + num2
	fmt.Println("sum= ",sum)
	return sum
}

func main(){
	//函数定义
	sum1,sub1 := cal_sub(20,30)	
	sum2,sub2 := cal_sub2(20,30)
	fmt.Println("和是：",sum1,"差是：",sub1)
	fmt.Println("和是：",sum2,"差是：",sub2)

	//可变参数列表
	change_func()
	change_func(1,2,3,4,5)

	//函数指针
	a := ptr_func
	fmt.Printf("a的类型是：%T，ptr_func的类型是：%T \n",a,ptr_func)
	a(10)

	//回调函数
	callback_func(1,3.14,a)

	//自定义数据类型 (编译认为是俩类型)
	type myint int
	var num3 myint = 18
	fmt.Println("myint:",num3)

	//匿名函数 定义时候调用
	result := func (num1 int, num2 int) int{
		return num1 + num2
	}(10,20)
	fmt.Println(result)

//闭包 返回是匿名函数 该函数引用了匿名函数外的变量
	f := getSum()
	fmt.Println(f(1)) //1
	fmt.Println(f(2)) // 3
	fmt.Println(f(3)) //6

//defer关键字 不立即zhixingdefer后的语句 而是压入栈 执行后面的语句
	fmt.Println("sum= ",add(10,30))



}